/*
 * 2018/11/28	19:30	qing
 */


.text		@代表接下来的内容放入代码段
.code 32	@代表接下来的内容翻译成ARM指令集
.global start	@声明全局start标号

start:
	mov r0, #10	@ r0 = 10
	b .		@ goto 当前位置执行，构成执行死循环

.end			@ 代表整个汇编文件的结束


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ c code :	x = (a + b) -c
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	adr r4, a	@ get address for a
	ldr r0, [r4]	@ get value of a
	adr r4, b	@ get address for b, reusing r4
	ldr r1, [r4]	@ get value of b
	add r3, r0, r1	@ compute a + b
	adr r4, c	@ get address for c
	sub r3, r3, r2	@ complete computation of x
	adr r4, x	@ get address for x
	str r3, [r4]	@ store value of x

	
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ c code :	y = a * (b + c)
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	adr r4, b	@ get address for b
	ldr r0, [r4]	@ get value of b
	adr r4, c	@ get address for c
	ldr r1, [r4]	@ get value of c
	add r2, r0, r2	@ compute partial result
	adr r4, a	@ get address for a
	ldr r0, [r4]	@ get value of a
	mul r2, r2, r0	@ compute final value for y
	adr r4, y	@ get address for y
	str r2, [r4]	@ store y


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ c code :	z = (a << 2) | (b & 15)
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	adr r4, a		@ get address for a
	ldr r0, [r4]		@ get value of a
	mov r0, r0, lsl#2	@ perform shift
	adr r4, b		@ get address for b
	ldr r1, [r4]		@ get value of b
	and r1, r1, #15		@ perform AND
	orr r1, r0, r1		@ perform OR
	adr r4, z		@ get address for z
	str r1, [r4]		@ store value for z


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ c code :	if (i == 0) {i = i + 10;}
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	subs r1, r1, #0
	addeq r1, r1, #10


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ c code :	for (i = 0; i < 15; i++) { j = j + j; }
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	sub r0, r0, r0		@ i -> r0 and i = 0
start	cmp r0, #15		@ is i < 15 ?
	addlt r1, r1, r1	@ j = j + j
	addlt r0, r0, #1	@ i++
	blt start


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ c code :	for (i = 0; i < 10; i++)
@			for (j = i + 1; j <= 10; j++)
@				z += 1;
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	@ r1 = z
	@ r1 = i
	@ r2 = j

start
	mov r1, #0	@ i = 0;
	mov r0, #0	@ z = 0;

loop:
	cmp r1, #10	@ i < 10
	beq stop
	add r2, r1, #1	@ j = i + 1

loop1:
	cmp r2, #10+1	@ j <= 10
	addne r0, r0, #1	@ z += 1
	addne r2, r2, #1	@ j++
	bne loop1
	add r1, r1, #1		@ i++
	b loop

stop:
	mov r0, #0x18
	ldr r1, =0x20026
	swi 0x123456


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ c code :	if (a < b) { x = 5; y = c + d; } else x = c - d;
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	@ compute and text condition

	adr r4, a	@ get address for a
	ldr r0, [r4]	@ get value of a
	adr r4, b	@ get address for b
	ldr r1, [r4]	@ get value for b
	cmp r0, r1	@ compare a < b
	bge fblcok	@ if a >= b, branch to false block


	@ true block

	mov r0, #5	@ generate value for x
	adr r4, x	@ get address for x
	str r0, [r4]	@ store x
	adr r4, c	@ get address for c
	ldr r0, [r4]	@ get value of c
	adr r4, d	@ get address for d
	ldr r1, [r4]	@ get value of d
	add r0, r0, r1	@ compute y
	adr r4, y	@ get address for y
	str r0, [r4]	@ store y
	b after		@ branch around false block


	@ false block

fblock	adr r4, c	@ get address for c
	ldr r0, [r4]	@ get value of c
	adr r4, d	@ get address for d
	ldr r1, [r4]	@ get value for d
	sub r0, r0, r1	@ compute a - b
	adr r4, x	@ get address for x
	str r0, [r4]	@ store value of x

after	...


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ c code :	(log) Compute k (n <= 2^k)
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	@ r0 = input variable n
	@ r0 = output variable m (0 by default)
	@ r1 = output variable k (n <= 2^k)

log
	mov r2, #0		@ set m = 0
	mov r1, #-1		@ set k = -1

log_loop
	tst r0, #1		@ test LSB(n) == 1
	addne r2, r2, #1	@ set m = m + 1 if true
	add r1, r1, #1		@ set k = k + 1
	movs r0, r0, lsr, #1	@ set n = n >> 1
	bne log_loop		@ continue if n != 0

	cmp r2, #1		@ test m == 1
	moveq r0, #1		@ set m = 1 if true

log_rtn
	mov pc, lr


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ c code :	数据块拷贝，利用LDR/STR指令
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@


num equ	10
src dcd	0,1,2,3,4,5,6,7,8,9
dst space 10*4

start:
	ldr r1, =src
	ldr r2, =dst
	mov r3, #num

loop:
	ldr r0, [r1], #4
	str r0, [r2], #4
	subs r3, r3, #1
	bne loop

stop:
	mov r0, #0x18
	ldr r1, =0x20026
	swi 0x123456


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ c code :	利用跳转表实现程序跳转
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

num equ 2

start:
	mov r0, #0
	mov r1, #3
	mov r2, #2
	bl arithfunc
	b

arithfunc:
	cmp r0, #num
	movhs pc, lr
	adr r3, jumptable
	ldr pc, [r3, r0, lsl #2]

jumptable:
	dcd DoAdd
	dcd DoSub

DoAdd:
	add r0, r1, r2
	mov pc, lr

DoSub:
	sub r0, r1, r2
	mov pc, lr


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ c code :	储器从0x400000开始的100个单元中存放着ASCII码，
@		编写程序，将其所有的小写字母转换成大写字母，
@		对其它的ASCII码不做变换
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	mov r0, #0x400000
	mov r1, #0

lp:
	ldrb r2, [r0, r1]
	cmp r2, #0x61
	blo next
	cmp r2, #0x7B		@ 0x61 - 0x7A 为小写字母的ASC
	sublo r2, r2, #0x20
	strblo r2, [r0, r1]

next:
	add r1, r1, #1
	cmp r1, #100
	bne lp


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ c code :	比较存储器中0x400000和0x400004两无符号字数据的大小，并且将比较结果存于0x400008的字中，若两数相等其结果记为0，
@		若前者大于后者其结果记为1，若前者小于后者其结果记为-1
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	mov r0, #0x400000
	ldr r1, [r0]		@ 取第1个数
	ldr r2, [r0, #4]	@ 取第2个数
	cmp r1, r2		@ 两个数相比较
	movhi r1, #1		@ r1 大
	movlo r1, #-1		@ r1 小
	moveq r1, #0		@ 两个数相等
	str r1, [r0, #8]


@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@
@ c code :	存储器中从0x400200开始有一个64位数。
@		（1）将取反，再存回原处；（2）求其补码，存放到0x400208处
@
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

	ldr r0, =0x400200
	ldr r2, =0xFFFFFFFF
	ldr r1, [r0]	@ 取低32位数
	eor r1, r1, r2	@ 取反
	str r1, [r0]	@ 存低32位反码
	adds r1, r1, #1	@ 又加1为求补
	str r1, [r0, #8]	@ 存低32位补码
	ldr r1, [r0, #4]	@ 取高32位数
	eor r1, r1, r2		@ 取反
	str r1, [r0, #4]	@ 存高32位反码
	adc r1, r1, #0		@ 高32位求补
	str r1, [r0, #12]	@ 存高32位补码

































































